// //
// // Created on 2024/11/28.
// //
// // Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
// // please include "napi/native_api.h".
//
// #include "headers/ProgramUtils.h"
// #include "headers/EGLCommon.h"
// #include "Log.h"
// #include <cmath>
// #include <cstring>
// #include <stdlib.h>
//
// GLuint ProgramUtils::createProgram() {
//     // 创建顶点着色器
//     GLuint vertex = LoadShader(GL_VERTEX_SHADER, VERTEX_SHADER);
//     if (vertex == 0) {
//         LOG_E("顶点着色器创建失败");
//         return 0;
//     }
//     // 创建片段着色器
//     GLuint fragment = LoadShader(GL_FRAGMENT_SHADER, FRAGMENT_SHADER);
//     if (fragment == 0) {
//         LOG_E("片段着色器创建失败");
//         return 0;
//     };
//     // 创建着色器程序
//     GLuint program = glCreateProgram();
//     if (program == 0) {
//         LOG_E("创建着色器程序失败");
//         glDeleteShader(vertex);
//         glDeleteShader(fragment);
//         return 0;
//     }
//
//     // The gl function has no return value.
//     glAttachShader(program, vertex);
//     glAttachShader(program, fragment);
//     // 链接程序对象
//     glLinkProgram(program);
//     GLint linked;
//     // 检查链接状态
//     glGetProgramiv(program, GL_LINK_STATUS, &linked);
//     if (linked != 0) {
//         glDeleteShader(vertex);
//         glDeleteShader(fragment);
//         return program;
//     }
//     LOG_E("链接程序对象失败");
//     GLint infoLen = 0;
//     // 获取程序对象信息日志的长度
//     glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLen);
//     if (infoLen > 1) {
//         char *infoLog = (char *)malloc(sizeof(char) * (infoLen + 1));
//         memset(infoLog, 0, infoLen + 1);
//         glGetProgramInfoLog(program, infoLen, nullptr, infoLog);
//         free(infoLog);
//         infoLog = nullptr;
//     }
//     glDeleteShader(vertex);
//     glDeleteShader(fragment);
//     glDeleteProgram(program);
//     return 0;
// }
//
// GLuint ProgramUtils::LoadShader(GLenum type, const char *shaderSrc) {
//     if ((type <= 0) || (shaderSrc == nullptr)) {
//         return 0;
//     }
//     GLuint shader = glCreateShader(type);
//     LOG_D("创建着色器程序:%{public}d", shader);
//     if (shader == 0) {
//         return 0;
//     }
//     // The gl function has no return value.
//     glShaderSource(shader, 1, &shaderSrc, nullptr);
//     glCompileShader(shader);
//
//     GLint compiled;
//     glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
//     LOG_D("glGetShaderiv:%{public}d", compiled);
//     if (compiled != 0) {
//         return shader;
//     }
//     GLint infoLen = 0;
//     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
//     LOG_E("infoLen:%{public}d", infoLen);
//     if (infoLen <= 1) {
//         glDeleteShader(shader);
//         return 0;
//     }
//     char *infoLog = (char *)malloc(sizeof(char) * (infoLen + 1));
//     if (infoLog != nullptr) {
//         memset(infoLog, 0, infoLen + 1);
//         glGetShaderInfoLog(shader, infoLen, nullptr, infoLog);
//         LOG_E("infoLen:%{public}s", infoLog);
//         free(infoLog);
//         infoLog = nullptr;
//     }
//     glDeleteShader(shader);
//     return 0;
// }
//
// GLuint ProgramUtils::loadProgram(int orientation, bool isMirror) {
//     // 创建着色器
//     GLuint eglProgram = createProgram();
//     if (eglProgram == 0) {
//         LOG_E("加载OpenGL扩展函数失败");
//         return 0;
//     }
//     // 使用当前着色器
//     glUseProgram(eglProgram);
//     glDisable(GL_CULL_FACE);
//     float radians = orientation * M_PI / 180.0f;
//     float cosTheta = cos(radians); // 计算 cos(θ)
//     float sinTheta = sin(radians); // 计算 sin(θ)
//     float rotationMatrix[16] = {
//         cosTheta, -sinTheta, 0.0f, 0.0f, // 第一行
//         sinTheta, cosTheta,  0.0f, 0.0f, // 第二行
//         0.0f,     0.0f,      1.0f, 0.0f, // 第三行
//         0.0f,     0.0f,      0.0f, 1.0f  // 第四行
//     };
//
//     GLuint rotationModelPos = glGetUniformLocation(eglProgram, "rotation_model");
//     GLuint mirrorModelPos = glGetUniformLocation(eglProgram, "mirror_model");
//     glUniformMatrix4fv(rotationModelPos, 1, GL_FALSE, rotationMatrix);
//     if (isMirror) {
//         // 创建绕 X 轴的镜像矩阵
//         glUniformMatrix4fv(mirrorModelPos, 1, GL_FALSE, mirror);
//     } else {
//         glUniformMatrix4fv(mirrorModelPos, 1, GL_FALSE, defaultMirror);
//     }
//     // 设置顶点数据
//     // 获取着色器中a_position属性的位置
//     GLuint apos = glGetAttribLocation(eglProgram, "a_position");
//     // 启用当前位置
//     glEnableVertexAttribArray(apos);
//     // 指定如何解析顶点数据
//     glVertexAttribPointer(apos, 3, GL_FLOAT, GL_FALSE, 0, vertices);
//     // 设置纹理信息
//     // 获取着色器中a_textCoord属性的位置
//     GLuint aTex = glGetAttribLocation(eglProgram, "a_textCoord");
//     // 启用当前位置
//     glEnableVertexAttribArray(aTex);
//     // 指定如何解析顶点数据
//     glVertexAttribPointer(aTex, 2, GL_FLOAT, GL_FALSE, 0, fragment);
//     // 解绑
//     glBindBuffer(GL_ARRAY_BUFFER, 0);
//     glBindVertexArray(0);
//     return eglProgram;
// }